# -*- coding: utf-8 -*-
from django.http import HttpResponse
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import viewsets
from rest_framework.authentication import BasicAuthentication, SessionAuthentication
from rest_framework.decorators import action
from rest_framework.filters import OrderingFilter
from rest_framework.permissions import AllowAny, IsAdminUser, IsAuthenticated, IsAuthenticatedOrReadOnly
from rest_framework.response import Response
from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView
from rest_framework.permissions import BasePermission, SAFE_METHODS
from user.models import User,Role,UserRole
from user.serializers import UserSerializer,RoleSerializer
from utils.api_paginator import PageNum


# 自定义权限（局部）
class MyPermission(BasePermission):
    # has_permission 是用户对这个视图有没有 GET POST PUT PATCH DELETE 权限的分别判断
    def has_permission(self, request, view):
        print('has_perm')
        # print(view.kwargs.get("pk"), request.user.id)
        """判1断用户对模型有没有访问权"""
        # 任何用户对使用此权限类的视图都有访问权限
        if request.user.is_superuser:
            # 管理员对用户模型有访问权
            return True
        elif view.kwargs.get('pk') == str(request.user.id):
            # 携带的id和用户的id相同时有访问权
            return True
        return False

    # has_object_permission 是用户过了 has_permission 判断有权限以后，再判断这个用户有没有对一个具体的对象有没有操作权限
    # 这样设置以后，即使是django admin管理员也只能查询自己user标的信息，不能查询其他用户的单条信息
    def has_object_permission(self, request, view, obj):
        print('has_object_perm')
        """获取单个数据时,判断用户对某个数据对象是否有访问权限"""
        if request.user.id == obj.id:
            return True
        return False


class UserViewSet(viewsets.ModelViewSet):
    """
    完成产品的增删改查
    """
    queryset = User.objects.all()
    serializer_class = UserSerializer  # 优先使用 get_serializer_class 返回的序列化器

    # # 1.认证：自定义认证类, 自定义会覆盖全局配置
    # authentication_classes = (BasicAuthentication, SessionAuthentication)
    # # 2.权限：自定义权限类
    # permission_classes = (MyPermission,)

    # 3.分页：自定义分页器 覆盖全局配置
    pagination_class = PageNum

    # 4.限流：自定义限流类
    throttle_classes = [UserRateThrottle]

    # 5.过滤：指定过滤方法类, 排序方法类, 一个或多个
    filter_backends = (DjangoFilterBackend, OrderingFilter)  # 同时支持过滤和排序
    # 5.1指定排序字段, 不设置, 排序功能不起效
    ordering_fields = ('date_joined', 'id')  # ?ordering=-id
    # 5.2指定过滤字段, 不设置, 过滤功能不起效
    filter_fields = ('username', 'mobile', 'is_active')  # ?username=tom&phone=&is_active=true

    # 根据不同的请求, 获得不同的序列化器
    def get_serializer_class(self):
        return UserSerializer

    @action(methods=['get'], detail=False)
    def unactived(self, request, *args, **kwargs):
        # 获取查询集, 过滤出未激活的用户
        qs = self.queryset.filter(is_active=False)
        # 使用序列化器, 序列化查询集, 并且是
        ser = self.get_serializer(qs, many=True)
        return Response(ser.data)

    @action(methods=['get'], detail=False)
    def actived(self, request, *args, **kwargs):
        # 获取查询集, 过滤出未激活的用户
        qs = self.queryset.filter(is_active=True)
        # 使用序列化器, 序列化查询集, 并且是
        ser = self.get_serializer(qs, many=True)
        return Response(ser.data)

    def perform_create(self, serializer):
        # print(self.request.data,'8888888888888888888888888')
        user_obj = serializer.save()
        role_ids = self.request.data.get("choiseRole")
        if role_ids:
            for role_id in role_ids:
                UserRole.objects.create(user_id=user_obj.id, role_id=role_id)

    def perform_update(self, serializer):
        user_obj = serializer.save()
        role_ids = self.request.data.get("choiseRole")  # 前段传过来的ID
        # 以前段穿过来的id为准，如果这个角色id以前就有，不变，如果没有添加
        # 前段没有传过来的id，但是数据库中有，删除
        user_obj.userrole_set.all().delete()  # 不管以前有没有角色，都删除
        for role_id in role_ids:  # for循环添加角色
            userrole = UserRole.objects.create(user=user_obj, role_id=role_id)

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)


class RoleViewSet(viewsets.ModelViewSet):
    """
    完成产品的增删改查
    """
    queryset = Role.objects.all()
    serializer_class = RoleSerializer  # 优先使用 get_serializer_class 返回的序列化器

    # 分页：自定义分页器 覆盖全局配置
    pagination_class = PageNum  # ?page=2&page_size=1

    # 过滤：指定过滤方法类, 排序方法类, 一个或多个
    filter_backends = (DjangoFilterBackend, OrderingFilter)  # 同时支持过滤和排序
    # 指定过滤字段, 不设置, 过滤功能不起效
    filter_fields = ('name', 'zh_name',)  # ?username=tom&phone=&is_active=true


class RegisterView(APIView):
    """
    用户注册, 权限是: 匿名用户可访问
    """
    # 自定义权限类
    permission_classes = (AllowAny,)

    def post(self, request):
        """
        1. username
        2. password
        3. mobile(可以为空)
        4. email（可以为空）
        """
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)


